package od_2025A.one;


import java.util.*;
import java.util.stream.Collector;
import java.util.stream.Collectors;

/**
 * https://blog.csdn.net/qq_45776114/article/details/146002436
 * 示例：
 * 输入：
 * 2 3 4 5
 * 4
 * 输出：
 * 5
 */
public class Test08 {

    public static void main(String[] args) {
        // 获取输入值
        Scanner scanner = new Scanner(System.in);
        String str1 = scanner.nextLine();
        String str2 = scanner.nextLine();
        scanner.close();

        // 解析 str1 为数组
        List<Integer> treeList = parse(str1);
        // 解析 str2 为整数
        int hour = Integer.parseInt(str2);

        // 如果 hour 小于 treeList 长度，输出0 结束方法
        if (hour < treeList.size()) {
            System.out.println(0);
            return;
        }
        // 如果 hour 等于 treeList 长度，输出 treeList中最大的值，结束方法
        Integer max = Collections.max(treeList);
        if (hour == treeList.size()) {
            System.out.println(max);
            return;
        }
        // 如果 hour 大于 treeList 长度，利用二分法，找到满足条件的最小值
        int r = max;
        int f = 1;
        int mid;
        int min = max;
        while (r >= f) {
            mid = f + ((r - f) >> 1);
            if (eat(mid, treeList, hour)) {
                r = mid - 1;
                min = Math.min(mid, min);
            } else {
                f = mid + 1;
            }
        }
        System.out.println(min);
    }

    /**
     * @param str
     * @return
     */
    private static List<Integer> parse(String str) {
        return Arrays.stream(str.split(" ")).map(Integer::parseInt).collect(Collectors.toList());
    }

    /**
     * 判断是否能够满足
     *
     * @param speed
     * @param hub
     * @param hour
     * @return
     */
    private static boolean eat(int speed, List<Integer> hub, int hour) {
        // 累加吃每棵树需要花费的时间
        int sum = 0;
        for (Integer count : hub) {
            sum += count % speed == 0 ? count / speed : (count / speed) + 1;
        }
        return sum <= hour;
    }
}
